#ifndef KET_BRA_HPP
#define KET_BRA_HPP

#include "ElementaryOperator.hpp"
#include "IdentityOperator.hpp"
#include "Amplitude.hpp"
#include <string>
#include <sstream>

class KetBra : public ElementaryOperator {
	public:
		KetBra() : row_(0), col_(0), amplitude_(0.0) {};
		KetBra(int r, int c, Amplitude a) : row_(r), col_(c), amplitude_(a) {};
		KetBra(const KetBra& kb) : row_(kb.getRow()), col_(kb.getCol()),
			amplitude_(kb.getAmplitude()) {};
		KetBra& operator=(const KetBra& rhs);
		virtual ~KetBra() {};

		std::string show() const;
    ElementaryOperatorP matMul(const ElementaryOperator& right) const;
    ElementaryOperatorP concreteMatMul(const KetBra& left) const;
    ElementaryOperatorP concreteMatMul(const IdentityOperator& left) const;

		// Access
		int getRow() const { return row_;};
    int getCol() const { return col_;};
    Amplitude getAmplitude() const { return amplitude_;};
		void setRow(int r) { row_ = r;};
		void setCol(int c) { col_ = c;};
		void setAmplitude(Amplitude a) { amplitude_ = a;};
	private:
		int row_;
		int col_;
		Amplitude amplitude_;
};

#endif 
